#!/usr/bin/env -S -P${HOME}/anaconda/bin python
# -*- coding:utf-8 -*-
##md文件去重
import re, os, shutil, time, sys, argparse
from itertools import chain
 
# 需要替换url的MD文件
md_file = 'D:\\workspace\\kidari'
 
# 保存图片文件的根目录
dir_base = 'D:\\workspace\\kidari\\_MD_Media'
# 图片原路径
dir_ori = 'D:/workspace/kidari/.vuepress/public/kkkkk'
 
# Markdown中图片语法 ![](url) 或者 <img src='' />
img_patten = r'!\[.*?\]\((.*?)\)|<img.*?src=[\'\"](.*?)[\'\"].*?>'
 
def delFile(rootdir):
    filelist=[]
    #选取删除文件夹的路径,最终结果删除img文件夹
    filelist=os.listdir(rootdir)                #列出该目录下的所有文件名
    for f in filelist:
        filepath = os.path.join( rootdir, f )   #将文件名映射成绝对路径
        if os.path.isfile(filepath):            #判断该文件是否为文件或者文件夹
            os.remove(filepath)                 #若为文件，则直接删除
            print("- "+str(filepath)+"-removed!")
        elif os.path.isdir(filepath):
            shutil.rmtree(filepath,True)        #若为文件夹，则删除该文件夹及文件夹内所有文件
            print("d "+str(filepath)+"-removed!")
    print("---删除成功---")

def get_img_local_path(md_file, path):
    """
    获取MD文件中嵌入图片的本地文件绝对地址
    :param md_file: MD文件
    :param path: 图片URL
    :return: 图片的本地文件绝对地址
    """
 
    result = None
 
    # /a/b/c
    if path.startswith('/') or (':\\') in path:
        result = path
    # ./a/b/c
    elif path.startswith('.'):
        result = '{0}/{1}'.format(os.path.dirname(md_file), path)
    # file:///a/b/c
    elif path.startswith('file:///'):
        result = path[8:]
        result = result.replace('%20',' ')
    else:
        result = '{0}/{1}'.format(os.path.dirname(md_file), path)
 
    return result
 
def local_2_local(md_file, dir_ts, match):
    """
    把MD中的本地图片移动到指定目录下，并返回URL。 这里并没有进行URL的替换
    :param md_file:
    :param dir_ts:
    :param match:
    :return: new_url，新本地文件地址。如果不需要替换，就返回空
    """
    dir_tgt = dir_base
    new_url = None
    # 判断是不是已经是一个图片的网址，或者已经在指定目录下or re.match('{}/.*'.format(dir_base), match))
    if not (re.match('((http(s?))|(ftp))://.*', match)) :
        # 如果图片url是本地文件，就替换到指定目录
        img_file = get_img_local_path(md_file, match)
        print("新url:"+img_file)
        if os.path.isfile(img_file):
            new_url = '{0}/{1}'.format(dir_tgt, os.path.basename(match))
            os.makedirs(dir_tgt, exist_ok=True)
            # 移动物理文件
            shutil.move(img_file, dir_tgt)
 
    return new_url
 
def replace_md_url(md_file):
    """
    把指定MD文件中引用的图片移动到指定地点（本地或者图床），并替换URL
    :param md_file: MD文件
    :return:
    """
 
    if os.path.splitext(md_file)[1] != '.md':
        print('{}不是Markdown文件，不做处理。'.format(md_file))
        return
 
    # 本次操作时间戳
    dir_ts = time.strftime('%Y-%m-%d-%H-%M-%S', time.localtime())
 
    with open(md_file, 'r',encoding='utf-8') as f: #使用utf-8 编码打开
        post = f.read()
        matches = re.compile(img_patten).findall(post)
        if matches and len(matches)>0 :
            # 多个group整合成一个列表
            for match in list(chain(*matches)) :
                if match and len(match)>0 :
                    new_url = None
                    new_url = local_2_local(md_file, dir_ts, match)                    

def file_name(file_dir):  
  L=[]  
  for root, dirs, files in os.walk(file_dir): 
    for file in files: 
      if os.path.splitext(file)[1] == '.md' and ('dist' not in root) and ('node_modules' not in root) : 
        L.append(os.path.join(root, file)) 
  return L 
 
if __name__ == '__main__':
    # replace_md_url(md_file)
    delFile(dir_base)
    L = file_name(md_file)
    for l in L:
        replace_md_url(l)